package jsp;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Author:石小俊
 * @Date:2022/12/13 9:40
 * @Version:1.0-SNAPSHOT
 * @Description: ServletContext,表示Servlet上下文
 * 该对象影响整个应用,可以通过该对象获取与整个应用相关的信息
 * 当服务器启动时,会为当前服务器中已经部署的工程创建一个与之对应的application对象
 * 一个项目只有一个application
 * 作用:
 *  1.可以通过application获取与服务器相关的信息
 *  2.可以作为数据中介,所有访问者共享一个存储数据的空间
 *      一般情况下,不会作为数据的作用域,数据过多会增加服务器压力
 *  如何在非JSP中获取该对象
 *  主要分为两种场景
 *   1.在Servlet中获取
 *      在GenericServlet中提供了获取的方法
 *      直接调用对应的方法即可
 *      ServletContext application = getServletContext()
 *   2.在任意类中获取
 *      想要获取application,必须存在request或者session才能获取到
 *      a.ServletContext application = request.getServletContext()
 *      b.ServletContext application2 = session.getServletContext();
 *   3.获取全局初始化参数
 */
@WebServlet("/app")
public class ApplicationServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.在Servlet中获取
         ServletContext application = getServletContext();
        // 2.通用
//        ServletContext application = request.getServletContext();
//        HttpSession session = request.getSession();
//        ServletContext application2 = session.getServletContext();

        // 应用场景:
        // 1.获取服务器所在位置
        // 获取服务器的指定位置,参数是表示相对于服务器根目录的地址
        // 如果参数是一个空字符串,表示的是服务器根目录
        // 如果参数是一个指定字符串,其返回值即为服务器根目录+指定字符串所表示的地址
//        String path = application.getRealPath("");
        String path = application.getRealPath("/upload/"+new SimpleDateFormat("yyyyMMdd").format(new Date()));
        System.out.println("path:"+path);
        // 在服务器根目录创建一个专门用于上传图片的目录:upload
        // 在该目录中,每天创建一个子目录,目录名为当天的年月日
        File file = new File(path);
        file.mkdirs();

        // 2.数据存储
        // 不建议使用,会导致服务器负载过高
        application.setAttribute("name","admin");

        // 3.获取全局初始化参数
        String username = application.getInitParameter("username");
        System.out.println("username:"+username);
        int i = 1/0;
    }

}
